package kr.co.cherryt.common;

import java.io.File;
import java.io.InputStream;

import android.app.AlertDialog;
import android.content.Context;
import android.content.DialogInterface;
import android.content.pm.PackageManager;
import android.content.res.AssetManager;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.drawable.BitmapDrawable;
import android.graphics.drawable.Drawable;
import android.os.Environment;
import android.widget.Toast;

public class Utility {
	
	private static final float DEFAULT_HDIP_DENSITY_SCALE = 1.5f;
	
	/**
	 * Asset에서 Drawable을 받아온다.
	 * @param context
	 * @param szUrl
	 * @return Drawable
	 */
	public static Drawable getAssetDrawable(Context context, String szUrl) {
		
//		Drawable drawable = null;
//		
//		try {
//			drawable = Drawable.createFromStream(context.getAssets().open(szUrl), null);
//			
//		} catch (Exception e) {
//		}
		
		Bitmap bm = Utility.getAssetBitmap(context, szUrl);
		BitmapDrawable drawable = new BitmapDrawable(bm);
		drawable.setTargetDensity(context.getResources().getDisplayMetrics());
				
		return drawable;
	}


	/**
	 * Asset 폴더의 Resource 이미지를  dpi 비율로 계산해서 변환 후 Drawable로 리턴
	 * @param context 
	 * @param szUrl - 리소스 url
	 * @return
	 */
	public static Drawable getAssetDrawableDp(Context context, String szUrl) {
		Bitmap bm = Utility.getAssetBitmapDp(context, szUrl);

		BitmapDrawable drawable = new BitmapDrawable(bm);
		drawable.setTargetDensity(context.getResources().getDisplayMetrics());

		return drawable;
	}


	/**
	 * Asset 폴더의 Resource 이미지를  dpi 비율로 계산해서 변환 후 Bitmap으로 리턴
	 * @param context  - 리소스 url
	 * @param szUrl
	 * @return
	 */
	public static Bitmap getAssetBitmapDp(Context context, String szUrl) {
		
		AssetManager amgr = context.getResources().getAssets();
		
		try {
			InputStream is = amgr.open(szUrl);
			
			Bitmap bm =  BitmapFactory.decodeStream(is);
			int nWidth = Utility.DPFromPixel(context, bm.getWidth());
			int nHeight = Utility.DPFromPixel(context, bm.getHeight());
			
			return Utility.ResizeBitmap(bm, nWidth, nHeight);
			
		} catch (Exception e) {
		}
		
		return null;
		
	}
	
	/**
	 * Asset에서 Bitmap을 받아온다.
	 * @param context
	 * @param szUrl
	 * @return Bitmap
	 */
	public static Bitmap getAssetBitmap(Context context, String szUrl) {
		
		AssetManager amgr = context.getResources().getAssets();
		
		try {
			InputStream is = amgr.open(szUrl);
			
			return BitmapFactory.decodeStream(is);
			
		} catch (Exception e) {
		}
		
		return null;
		
	}
	
	public static Bitmap getAssetBitmapLazy(Context context, Bitmap bm, String szUrl) {
		if(bm == null){
			bm = getAssetBitmap(context, szUrl);
		}
		return bm;
	}
	
	/**
	 * bitmap -> drawable 변환
	 * @param bm
	 * @return
	 */
	public static Drawable changeBitmapDrawable(Bitmap bm) {
		return new BitmapDrawable(bm);
		
	}
	
	
	/**
	 * 문자열을 정수형(int)으로 바꾼다.
	 * @param szString
	 * @return
	 */
	public static int parseInt(String szString) {
		
	    if (!Utility.IsEmpty(szString)) {
	        try {
	            return Integer.parseInt(szString);
	        } catch (Exception e) {
                return 0;
            }
	    }
        return 0;
	}
	
	/**
	 * 픽셀 단위를 현재 디스플레이 화면에 비례한 크기로 변환합니다.
	 * @param context
	 * @param nPixel
	 * @return
	 */
	public static int DPFromPixel(Context context, int nPixel) {
		float fScale= context.getResources().getDisplayMetrics().density;
		return (int) (nPixel / DEFAULT_HDIP_DENSITY_SCALE * fScale);
		
	}
	
	/**
	 * 현재 디스플레이 화면에 비례한 DP단위를 픽셀 크기로 변환합니다.
	 * @param context
	 * @param nDP
	 * @return
	 */
	public static int PixelFromDP(Context context, int nDP) {
		float fScale = context.getResources().getDisplayMetrics().density;
		return (int) (nDP / fScale * DEFAULT_HDIP_DENSITY_SCALE);
		
	}
	
	/**
     *  Bitamp을 Resize한 뒤 리턴한다.
     * @param bm
     * @param w
     * @param h
     * @return
     */
    static public Bitmap ResizeBitmap(Bitmap bm, int w, int h) {

        if (bm != null) {
            if (bm.getWidth() != w || bm.getHeight() != h) {

                if (w != 0 && h != 0) {
                    Bitmap resizedBm = Bitmap.createScaledBitmap(bm, w, h, true);
                    return resizedBm;
                }
            }
        }

        return bm;
    }
    
    /**
	 * String의 null, Empty를 동시에 체크한다
	 * @param szData - 체크할 데이터
	 * @return - Empty인 경우 true
	 */
    public static boolean IsEmpty(String szData){
    	if(szData == null || szData.length() < 1){
    		return true;
    	}
    	return false;
    }
    
    public static boolean isEqual(String szData, String[] arCmpData){
    	if(Utility.IsEmpty(szData) == false && arCmpData != null){
        	for(String aData : arCmpData){
        		if(aData.equals(szData)){
        			return true;
        		}
        	}
    	}
    	return false;
    }
    
    /**
     * 외장 메모리가 있는지 여부 확인
     * @return - 외장메모리 여부
     */
	public static boolean isMoundExternalStorage() {
		return Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED);
		
	}
	
	/**
	 * 외장 메모리에 폴더 생성한다.
	 * @param context
	 * @return - 생성된 폴더 경로
	 */
	public static String getBaseExternalFolder(Context context){
    	
		if (!isMoundExternalStorage()) {
			return null;
		}
		
		String szFolder = Environment.getExternalStorageDirectory().getAbsolutePath() 
				+ "/Android" + "/data" + "/" + context.getPackageName();
		
		File folder = new File(szFolder);
		
		if (!folder.exists()) {
			folder.mkdir();
		}
		
		return szFolder;
    	
    }
	
	/**
     * 토스트를  띄워준다 
     * @param c - context 
     * @param szText - 보여질 문자열
     */
	public static void showToast(Context c, String szText){
		showToast(c, szText, false);
	}
	
	
	/**
	 * 토스트를  띄워준다
	 * @param c - context
	 * @param szText - 보여질 문자열
	 * @param bLong - true인 경우 오래 보여짐
	 */
	public static void showToast(Context c, String szText,Boolean bLong){
    	if(bLong == true){
    		Toast.makeText(c,szText, Toast.LENGTH_LONG).show();
    	}else{
    		Toast.makeText(c,szText, Toast.LENGTH_SHORT).show();
    	}
    }
	
	/**
     * 앱이 설치되어 있는지 확인한다
     */
    public static boolean installAppCheck(PackageManager pm, String szPackageName) {
        // 앱 설치 여부 리플레쉬
        if (szPackageName != null) {
            try {
                pm.getInstallerPackageName(szPackageName); 
                return true;
            } catch (Exception e) {
                // 앱이 미설치된 경우
                return false;
            }
        }
        return false;
    }
    
    /**
	 * 단순 알럿창을 보여준다 리스너 연결 안됨
	 * @param context - context
	 * @param msg - 메세지
	 */
   public static void showAlert(Context context, String msg) {
   	new AlertDialog.Builder(context)
		.setTitle("확인")
		.setMessage(msg)
		.setNeutralButton("OK", new DialogInterface.OnClickListener() {
			
			public void onClick(DialogInterface dialog, int which) {
				dialog.dismiss();
			}
		}).create().show();
   }
   
   public static void showAlertWithTitle(Context context, String titles, String msg) {
	     new AlertDialog.Builder(context)
	   .setTitle(titles)
	   .setMessage(msg)
	   .setNeutralButton("OK", new DialogInterface.OnClickListener() {
	    
	    public void onClick(DialogInterface dialog, int which) {
	     dialog.dismiss();
	    }
	   }).create().show();
	    }
}